package cn.xiaobai.listener;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import cn.xiaobai.monitor.MonitorServer;

import java.io.File;

/**
 * @Author yangdaji
 * @Date 2022/11/11 0011
 * @PackageName xiaobai.listener
 * @ClassName PushChannelChangeListener
 */
@Component
@Slf4j
public class PushChannelChangeListener extends FileAlterationListenerAdaptor {

    @Autowired
    private MonitorServer monitorServer;

    @Override
    public void onStart(FileAlterationObserver observer) {
        // 单纯提示
//        log.info("监听器监听中....");
    }

    @Override
    public void onStop(FileAlterationObserver observer) {
        // 单纯提示
//        log.info("监听器暂时停止!");
    }

    @Override
    public void onDirectoryCreate(File directory) {
        // 目录创建, 扫描该目录下是否符合条件的文件,后面在触发创建文件时会进行判断
        log.info("检测到新建了一个目录, 即将扫描该目录下的文件....");
    }


    @Override
    public void onDirectoryDelete(File directory) {
        // 频道文件目录删除, 恢复原始频道推送
        log.info("检测到删除了频道映射, 即将恢复原始频道....");
        monitorServer.resetChannel();
    }

    @Override
    public void onFileChange(File file) {
        // 文件修改后进行刷新缓存
        log.info("检测到频道修改,即将刷新推送频道....");
        monitorServer.refreshChannel(file);
    }


    @Override
    public void onFileCreate(File file) {
        // 文件创建,触发推送操作, 如果没有数据,也不会进行推送
        log.info("检测到创建了映射文件, 频道映射即将更新(注: 不存在数据则不更新)....");
        monitorServer.loadChannelToDataMap(file);
    }

    @Override
    public void onFileDelete(File file) {
        // 文件删除, 该数据停止推送
        log.info("检测到映射文件删除,即将恢复原始推送频道......");
        monitorServer.resetChannel();
    }

}
